// 三、基于下面提供的代码，完成后续的四个练习
const fp = require('lodash/fp')
const { MayBe, Container } = require('./support')

// 练习1：使用fp.add(x,y)和fp.map(f,x)创建一个能让function里的值增加的函数ex1
let maybe = MayBe.of([5, 6, 1])
let ex1 = (addNum) => {
  return function (array) {
    return fp.map(value => fp.add(addNum, value), array)
  }
}
console.log('练习1：', maybe.map(ex1(2))._value)

// 练习2：实现一个函数ex2，能够使用fp.first获取列表的第一个元素
let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
let ex2 = (array) => {
  return fp.first(array)
}
console.log('练习2：', xs.map(ex2)._value)

// 练习3：实现一个函数ex3，使用safeProp和fp.first找到user的名字的首字母
let safeProp = fp.curry(function (x, o) {
  return MayBe.of(o[x])
})
let user = { id: 2, name: 'Albert' }
let ex3 = user => {
  let userName = safeProp('name')
  return { name: userName(user)._value || '', initials: fp.first(userName(user)._value || '') }
}
let userNameInfo = ex3(user) || {}
console.log('练习3：', `用户的姓名是${userNameInfo.name}，首字母是${userNameInfo.initials}`)

// 练习4：使用MayBe重写ex4，不要有if语句
let ex4 = function (n) {
  if (n) {
    return parseInt(n)
  }
}
let resetEx4 = (n) => {
  let maybe = MayBe.of(n)
  return maybe.map(parseInt)._value
}
console.log('练习4：', resetEx4(1), resetEx4(), ex4(1), ex4())